#ifndef DSPSIMULATOR_DSPSIMULATOR_H
#define DSPSIMULATOR_DSPSIMULATOR_H

#include <simulatorV1/llvmJit/llvmJit.h>
#include <simulatorV1/parser/parser.h>
#include <simulatorV1/instruction/dspInstruction.h>

class DspSimulator {
private:
    std::shared_ptr<LLVMJit> m_llvmJit;     // llvm jit执行引擎

    std::shared_ptr<Parser> m_parser;   // 语法分析器

    std::vector<std::shared_ptr<DspInstruction>> m_instProto;  // 指令原型

    /**
     * 该函数用于初始化A0-A31,B0-B31寄存器的值为0,并将这些寄存器以全局变量的形式加载到jit中
     */
    void initialRegisterInfo();

    /**
     * 添加模拟器支持的指令原型
     */
    void addInstructionProto();

    /**
     * 根据语法分析得到的程序节点生成一个ir函数
     * @param programNode 程序节点
     * @return ir函数名
     */
    std::string generateIRFunc(std::shared_ptr<ProgramNode> programNode);

    /**
     * 根据函数节点生成ir语句，生成的ir语句与函数节点对应的指令功能等同
     * @param functionNode 函数节点,一个函数节点对应一条指令
     * @param module llvm模块，一个模块类似于一个cpp文件
     */
    void generateInstructionIR(std::shared_ptr<FunctionNode> functionNode, llvm::Module *module);

    /**
     * 创建的函数可能需要访问寄存器信息，该函数用于创建寄存器全局变量的声明
     * @param module llvm模块，一个模块类似于一个cpp文件
     */
    void generateRegisterIRIntoModule(llvm::Module *module);

public:
    DspSimulator();

    void run();
};

#endif //DSPSIMULATOR_DSPSIMULATOR_H
